<?php
class PlanController extends BaseController{

	public function __construct(){

	}

	public function index(){
		return View::make('plan.index');
	}

	public function exporterrortoexcel(){
		$errors = Session::get('import_plan_error');

		// Instantiate a new PHPExcel object
		$objPHPExcel = new PHPExcel();

		$objPHPExcel->setActiveSheetIndex(0);
		$objPHPExcel->getActiveSheet()->setTitle('Danh sách lỗi');
		$objPHPExcel->getActiveSheet()
					->SetCellValue('A1', 'Mã sản phẩm')
					->SetCellValue('B1', 'Tồn kho hiện tại')
					->SetCellValue('C1', 'Tồn kho đầu kỳ')
					->SetCellValue('D1', 'Trạng thái lỗi');

		excel::setColor($objPHPExcel, 'A1:D1', 'D3D3D3');

		foreach ($errors as $key => $row) {
			$key += 2;
			$objPHPExcel->getActiveSheet()
					->SetCellValue('A'.$key, $row['code'])
					->SetCellValue('B'.$key, (int)$row['in_stock'])
					->SetCellValue('C'.$key, (int)$row['amount'])
					->SetCellValue('D'.$key, $row['status']);
		}

		// Instantiate a Writer to create an OfficeOpenXML Excel .xlsx file
		$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);

		header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
		header('Content-Disposition: attachment;filename="Errors_plan.xlsx"');
		header('Cache-Control: max-age=0');

		$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
		$objWriter->save('php://output');
	}

	/**
	 * gọi hàm này khi POST
	 * import kế hoạch. Nếu lỗi thì thông báo và cho phép tải file
	 * Sử dụng transaction để rollback lại nếu có sản phẩm lỗi hoặc gặp lỗi hệ thông
	 * @return [type] [description]
	 */
	public function import(){
		// lấy giá trị file được post lên
		$product_file = Input::file('product_file');
		$file = $product_file->getRealPath();

		$configPlan = Config::get('tanco/plan');

		$objReader = new PHPExcel_Reader_Excel2007($file);
		$objPHPExcel = $objReader->load($file);

		$sheetActive = $objPHPExcel->getActiveSheet();
		$idShop = $sheetActive->getCell($configPlan['shop'])->getValue();
		$date 	= $sheetActive->getCell($configPlan['date'])->getValue();

		// danh sach lỗi
		$errors = array();

		// check xem tháng này đã được nhập hay chưa
		if(plan::getStatus($idShop, $date)){
			return View::make('plan.index', array(	'mess' => "Dữ liệu <b>$date</b> đã được nhập trước đó",
													'type'=>'danger'));
		}

		$AllSheet = $objPHPExcel->getAllSheets();

		try{
			// bắt đầu transaction
			DB::connection()->getPdo()->beginTransaction();
			foreach($AllSheet as $key=>$sheet){

				// lấy giá trị dư liệu của file excel
				$data = $sheet->toArray(null,true,true,true);

				// lấy tổng số dòng và cột
				$row_start = $configPlan['row_product_start'];
				$row_end = $sheet->getHighestRow();

				// kiểm tra nếu sheet là "Các loại khác" thì thêm mới sản phẩm
				if($sheet->getTitle() == 'Cac loai khac'){

					for($row = $row_start; $row <= $row_end; $row++){
						// thêm sản phẩm khác
						$product = new Product();
						$product->code = microtime(true);
						$product->name = $data[ $row][$configPlan['order_name'] ];
						$product->unit = $data[ $row][$configPlan['order_unit'] ];
						$product->wpi = $data[ $row][$configPlan['order_wpi'] ];

						$product->save();

						for($month = 3; $month > 0; $month--){
							$plan = new plan();
							$plan->branch = $idShop;
							$plan->date = $date;
							$plan->times = $month;
							// nhập kho
							$plan->product = $product->id;

							// product
							$plan->certain_amount = $data[$row][ $configPlan['order_month'][$month]['certain_amount'] ];
							$plan->potentiality_amount = $data[$row][ $configPlan['order_month'][$month]['potentiality_amount'] ];
							$plan->guess_amount = $data[$row][ $configPlan['order_month'][$month]['guess_amount'] ];
							$plan->note = $data[$row][ $configPlan['order_month'][$month]['note'] ];
							$plan->in_stock = $data[$row][ $configPlan['order_month'][$month]['in_stock'] ];
							$plan->on_the_way = $data[$row][ $configPlan['order_month'][$month]['on_the_way'] ];
							// end product

							$plan->sold_amount = $data[$row][ $configPlan['col_sold_amount'] ];

							$plan->save();

						}
					}

				}else{
					for($row = $row_start; $row <= $row_end; $row++){
						$id = product::GetID($data[$row][$configPlan['col_product']]);

						// tồn kho đầu kỳ tháng đầu tiên trong file excel
						$tonKhoDauKyExcel = $data[$row][ $configPlan['month'][3]['in_stock'] ];

						// nếu sản phẩm không tồn tại thì lưu lại code và tiếp tục vòng lặp khác
						if($id == -1){
							$errors[] = array(
									'code'=> $data[ $row][$configPlan['col_product'] ],
									'in_stock'=> $tonKhoDauKyExcel,
									'amount' => 0,
									'status'=> 'Không tìm thấy'
								);
							continue;
						} // end if

						// tổng số sản phẩm trong kho
						$amount = Inventory::GetInStock($id, $idShop, $date);
						//echo "<p>$amount != $tonKhoDauKyExcel</p>";
						if( $amount == -1 || $amount != $tonKhoDauKyExcel ){
							$errors[] = array(
									'code'=> $data[ $row][$configPlan['col_product'] ],
									'in_stock'=> $tonKhoDauKyExcel,
									'amount' => $amount,
									'status'=> "Dữ liệu không khớp"
								);
							continue;
						}

						for($month = 3; $month > 0; $month--){
							$plan = new plan();
							$plan->branch = $idShop;
							$plan->date = $date;
							// ước tính lần thứ
							$plan->times = $month;
							// nhập kho
							$plan->product = $id;

							// product
							$plan->certain_amount = $data[$row][ $configPlan['month'][$month]['certain_amount'] ];
							$plan->potentiality_amount = $data[$row][ $configPlan['month'][$month]['potentiality_amount'] ];
							$plan->guess_amount = $data[$row][ $configPlan['month'][$month]['guess_amount'] ];
							$plan->note = $data[$row][ $configPlan['month'][$month]['note'] ];
							$plan->in_stock = $data[$row][ $configPlan['month'][$month]['in_stock'] ];
							$plan->on_the_way = $data[$row][ $configPlan['month'][$month]['on_the_way'] ];
							// end product

							$plan->sold_amount = $data[$row][ $configPlan['col_sold_amount'] ];

							$plan->save();

						} // end for month
					} // end for row_start
				} // end else
			} //end foreach AllSheet

			// nếu có lỗi thì đẩy lỗi vào session để sau này download và rollback
			if($errors){
				Session::put('import_plan_error', $errors);
				DB::connection()->getPdo()->rollBack();

				return View::make('plan.index',
						array('mess' => count($errors). " thông tin sản phẩm lỗi (<a href='/plan/exporterror'>Tải file</a>)",
						'type'=>'danger'));
			}else{
				// đồng thời check status cho kế hoạch tháng nãy đã được nhập
				plan::insertStatus($idShop, $date);

				// nếu không có lỗi gì xảy ra thì commit lưu lên csdl thật sự
				DB::connection()->getPdo()->commit();

				return View::make('plan.index',
							array('mess' => "Nhập kế hoạch $date thành công",
							'type'=>'success'));
			}
		}catch(Exception $ex){
			DB::connection()->getPdo()->rollBack();
		}

		return View::make('plan.index');
	}
}